IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='spCentroCosto_Insert' and XTYPE='P')
BEGIN
	DROP PROCEDURE [dbo].[spCentroCosto_Insert]
END
GO
CREATE PROCEDURE [dbo].[spCentroCosto_Insert]
	 @OP VARCHAR(64)=NULL
	,@ParamAuxiliar NVARCHAR(MAX)=NULL  /* PARAMETRO AUXILIAR */
	,@Id INT=NULL
	,@CodCentroCosto VARCHAR(16)=NULL
	,@CodCentroCostoSuperior VARCHAR(16)=NULL
	,@NombreCentroCosto VARCHAR(128)=NULL
	,@Activo BIT=NULL
WITH ENCRYPTION
AS
SET NOCOUNT ON
BEGIN TRY

/**** VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/
-----EXEC SP_ExecuteSQL N'dbo.spSeguridadUsuario @OP=''VerificarSessionActiva'''
/**** FIN - VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/

DECLARE @AUX VARCHAR(2048)

/*****     OPERACION POR DEFECTO    *****/
IF @OP IS NULL OR @OP = ''
BEGIN

	--- Verifico que el centro de costo no sea definido con Grupo del MISMO	
	IF @CodCentroCosto IS NOT NULL AND @CodCentroCosto=@CodCentroCostoSuperior
	BEGIN
		SET @AUX='El Centro de costo "'+@NombreCentroCosto+'" Presenta Inconsistencias, Verifique!'
		RAISERROR(@AUX,16,1)
		RETURN 1
	END
	
	--- Verifico que se definan subgrupos.
	IF 
		@CodCentroCostoSuperior IS NOT NULL 
		AND EXISTS (SELECT * FROM CentroCosto WHERE CodCentroCosto=@CodCentroCostoSuperior AND CodCentroCostoSuperior IS NOT NULL)
	BEGIN
		SELECT @AUX='El Centro de costo "'+NombreCentroCosto+'" Ya pertenece al GRUPO "'+CodCentroCostoSuperior+'", No puede ser definido como GRUPO del Centro Costo "'+@NombreCentroCosto+'", verifique.'
			FROM CentroCosto
				WHERE CodCentroCosto=@CodCentroCostoSuperior				
		RAISERROR(@AUX,16,1)
		RETURN 1
	END
	
	BEGIN TRANSACTION
	INSERT INTO [dbo].[CentroCosto]
		(
		 [CodCentroCosto]
		,[CodCentroCostoSuperior]
		,[NombreCentroCosto]
		,[Activo]
		)
	VALUES
		(
		 @CodCentroCosto
		,CASE WHEN RTRIM(@CodCentroCostoSuperior)='' THEN NULL ELSE @CodCentroCostoSuperior END --@CodCentroCostoSuperior
		,@NombreCentroCosto
		,CASE WHEN @Activo IS NULL THEN 1 ELSE @Activo END --@Activo
		)

	---- Si la tabla Tiene una columna IDENTITY, Devuelvo el registro del ultimo Indentity INSERTADO
	---- (Esto se hace para que .NET Trabaje correctamente)
	SELECT * FROM [dbo].[CentroCosto] WHERE [Id]=SCOPE_IDENTITY()

	COMMIT TRANSACTION
	RETURN 0
END

--- Si se llega a este punto es porque el @OP indicado no Existe en el Procedimiento Almacenado
IF @OP IS NOT NULL
	BEGIN
	SET @ParamAuxiliar='La Operacion "'+@OP+'" No esta definida en el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'", Revise!.'
	RAISERROR(@ParamAuxiliar,16,1)
	RETURN 1
END

--- CONTROLAR Y REGISTRAR LOS ERRORES
END TRY
BEGIN CATCH
	--- Recopilo la informacion del error
	DECLARE @ERROR_NUMBER INT=ERROR_NUMBER(),@ERROR_SEVERITY INT=ERROR_SEVERITY(),@ERROR_STATE INT=ERROR_STATE(),@ERROR_PROCEDURE VARCHAR(128)=ERROR_PROCEDURE(),@ERROR_LINE INT=ERROR_LINE(),@ERROR_MESSAGE VARCHAR(4096)=ERROR_MESSAGE()
	--- Si hay transacciones abiertas, hago un rollback, SE ENCIERRA EN UN (TRY-CATCH) PARA QUE NO SE MUESTRE EL ERROR: Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT
	IF(@@TRANCOUNT>0) BEGIN BEGIN TRY ROLLBACK TRANSACTION END TRY BEGIN CATCH END CATCH END
	--- Ejecuto el SP que controla y registra el error
	EXEC [spSeguridadMessageException] @OP='MostrarMensaje',@ERROR_NUMBER=@ERROR_NUMBER,@ERROR_SEVERITY=@ERROR_SEVERITY,@ERROR_STATE=@ERROR_STATE,@ERROR_PROCEDURE=@ERROR_PROCEDURE,@ERROR_LINE=@ERROR_LINE,@ERROR_MESSAGE=@ERROR_MESSAGE
	RETURN 1
END CATCH;
